//
//  CustomTabBar.m
//  WidgetDemo
//
//  Created by 航汇聚科技 on 2017/12/21.
//  Copyright © 2017年 Yi Zhou. All rights reserved.
//

#import "CustomTabBar.h"
#import "VerticalCenterButton.h"

@interface CustomTabBar()

/**
 中间凸起的按钮
 */
@property (nonatomic, strong) VerticalCenterButton *centerButton;

@end

@implementation CustomTabBar

- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        // 设置tabBarItem选中状态时的颜色
        self.tintColor = [UIColor redColor];
        // 添加中间按钮到tabBar上
        [self addSubview:self.centerButton];
    }
    return self;
}

- (VerticalCenterButton *)centerButton {
    if (!_centerButton) {
        _centerButton = [[VerticalCenterButton alloc] initWithFrame:CGRectMake(0, 0, 80, 60)];
        [_centerButton setImage:[UIImage imageNamed:@"tabBar_center"] forState:UIControlStateNormal];
//        [_centerButton setTitle:@"center" forState:UIControlStateNormal];
//        _centerButton.titleLabel.font = [UIFont systemFontOfSize:13];
//        [_centerButton setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
        [_centerButton addTarget:self action:@selector(clickCenterButton:) forControlEvents:UIControlEventTouchUpInside];
    }
    return _centerButton;
}

- (void)clickCenterButton:(UIButton *)sender {
    NSLog(@"点击中间的button");
}

/**
 重新布局tabBar
 */
- (void)layoutSubviews {
    [super layoutSubviews];
    
    //取出 tabBarButton
    NSMutableArray *tabBarButtonArray = [NSMutableArray array];
    for (UIView *view in self.subviews) {
        if ([view isKindOfClass:NSClassFromString(@"UITabBarButton")]) {
            [tabBarButtonArray addObject:view];
        }
    }
    
    CGFloat barWidth = self.bounds.size.width;
    CGFloat barHeight = self.bounds.size.height;
    CGFloat centerBtnWidth = CGRectGetWidth(self.centerButton.frame);
    CGFloat centerBtnHeight = CGRectGetHeight(self.centerButton.frame);
    
    //向上偏移的距离
    CGFloat upwardMigration = 8.;
    if ([UIScreen mainScreen].bounds.size.height == 812) {
        upwardMigration = 34. + upwardMigration;
    }
    // 设置中间按钮的位置，居中，凸起一丢丢
    self.centerButton.center = CGPointMake(barWidth / 2, barHeight - centerBtnHeight/2 - upwardMigration);
    // 重新布局其他 tabBarItem
    // 平均分配其他 tabBarItem 的宽度
    CGFloat barItemWidth = (barWidth - centerBtnWidth) / tabBarButtonArray.count;
    // 逐个布局 tabBarItem，修改 UITabBarButton 的 frame
    [tabBarButtonArray enumerateObjectsUsingBlock:^(UIView *  _Nonnull view, NSUInteger idx, BOOL * _Nonnull stop) {
        
        CGRect frame = view.frame;
        if (idx >= tabBarButtonArray.count / 2) {
            // 重新设置 x 坐标，如果排在中间按钮的右边需要加上中间按钮的宽度
            frame.origin.x = idx * barItemWidth + centerBtnWidth;
        } else {
            frame.origin.x = idx * barItemWidth;
        }
        // 重新设置宽度
        frame.size.width = barItemWidth;
        view.frame = frame;
    }];
    // 把中间按钮带到视图最前面
    [self bringSubviewToFront:self.centerButton];
}

/**
 在 iOS 中，当产生一个 touch 事件之后（点击屏幕），通过 hit-Testing 找到触摸点所在的 View（ hit-TestView ）。寻找过程总结如下（默认情况下）：
 1. 从视图层级最底层的 window 开始遍历它的子 View。
 2. 默认的遍历顺序是按照 UIView 中 Subviews 的逆顺序。
 3. 找到 hit-TestView 之后，寻找过程就结束了。
 
 确定一个 View 是不是 hit-TestView 的过程如下：
 1. 如果 View 的 userInteractionEnabled = NO，enabled = NO（ UIControl ），或者 alpha <= 0.01， hidden = YES 等情况的时候，直接返回 nil（不再往下判断）。
 2. 如果触摸点不在 view 中，直接返回 nil。
 3. 如果触摸点在 view 中，逆序遍历它的子 View ，重复上面的过程。
 4. 如果 view 的 子view 都返回 nil（都不是 hit-TestVeiw ），那么返回自身（自身是 hit-TestView ）。

 @param point <#point description#>
 @param event <#event description#>
 @return <#return value description#>
 */
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    if (self.clipsToBounds || self.hidden || (self.alpha == 0.f)) {
        return nil;
    }
    UIView *result = [super hitTest:point withEvent:event];
    // 如果事件发生在 tabbar 里面直接返回
    if (result) {
        return result;
    }
    // 这里遍历那些超出的部分就可以了，不过这么写比较通用。
    for (UIView *subview in self.subviews) {
        // 把这个坐标从tabbar的坐标系转为 subview 的坐标系
        CGPoint subPoint = [subview convertPoint:point fromView:self];
        result = [subview hitTest:subPoint withEvent:event];
        // 如果事件发生在 subView 里就返回
        if (result) {
            return result;
        }
    }
    return nil;
}

@end
